package com.tbit.main.dao.core;

import com.tbit.main.pojo.Machine;
import com.tbit.main.pojo.Park;
import com.tbit.main.pojo.ParkMachine;
import com.tbit.main.pojo.VO.MachineVO;
import com.tbit.main.pojo.bo.BatchMoveMachineBO;
import com.tbit.main.pojo.dto.CheckMachineDTO;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 设备
 *
 * @author Leon
 * 2019年11月9日 下午4:05:20
 */
public interface MachineDao {

    /**
     * 根据设备编号查询
     *
     * @param machineNO
     * @return
     */
    Machine getByMachineNO(String machineNO);

    Machine getFLM(Map<String, Object> map);

    /**
     * 根据设备id查询
     *
     * @param machineId
     * @return
     */
    Machine getByMachineId(Integer machineId);

    /**
     * 根据停车点id查询
     *
     * @param params
     * @return
     */
    List<Machine> getByParkPointId(Map<String, Object> params);

    /**
     * 根据代理商id查询
     *
     * @param accountId
     * @return
     */
    List<Machine> getByAccountId(Integer accountId);

    /**
     * 根据代理商id分页查询
     *
     * @param map
     * @return
     */
    List<MachineVO> getByAccountIdPag(Map<String, Object> map);

    /**
     * 查询代理商投放车辆总数
     *
     * @param accountId
     * @return
     */
    Integer getCountByAccountId(Integer accountId);

    /**
     * 查询代理商投放车辆总数
     *
     * @param map
     * @return
     */
    Integer getCountByAccountIdType(Map<String, Object> map);

    /**
     * 查询代理商集合投放车辆总数
     *
     * @param params
     * @return
     */
    List<Map<String, Object>> getCountByAccountIds(Map<String, Object> params);

    /**
     * 修改车辆状态
     *
     * @param params
     */
    void changeState(Map<String, Object> params);

    /**
     * 根据车辆id批量查询
     *
     * @param params
     * @return
     */
    List<Machine> getByMachineIds(Map<String, Object> params);

    /**
     * 根据车辆id批量查询
     *
     * @param params
     * @return
     */
    List<Machine> getByMachineIdsAll(Map<String, Object> params);

    /**
     * 根据设备编号批量查询
     *
     * @param params
     * @return
     */
    List<Machine> getByMachineNOs(Map<String, Object> params);

    /**
     * 投放
     *
     * @param parkMachine
     */
    void put(ParkMachine parkMachine);

    /**
     * 取消投放
     *
     * @param machineId
     */
    void recovery(Integer machineId);

    /**
     * 根据车辆id查询站点
     *
     * @param machineId
     * @return
     */
    ParkMachine getParkId(Integer machineId);

    /**
     * 根据车辆id查询车辆与站点关系
     * @param machineIds 车辆站点
     * @return 。
     */
    List<ParkMachine> getParkMachineByMachineIds(Collection<Integer> machineIds);

    /**
     * 查询闲置车辆
     *
     * @param params
     * @return
     */
    List<Machine> getUnUseByAccountId(Map<String, Object> params);

    /**
     * 查询临时停车信息
     *
     * @param machineId
     * @return
     */
    Park getParkByMachineId(Integer machineId);

    /**
     * 获取骑行中的设备
     *
     * @param machineId
     * @return
     */
    List<Machine> getUseingByAccountId(Integer machineId);

    /**
     * 获取骑行中的设备
     *
     * @param regionId
     * @return
     */
    List<Machine> getUseingByRegionId(String regionId);

    /**
     * 获取骑行中的设备
     *
     * @param params
     * @return
     */
    List<Machine> getUseingByAccountIds(Map<String, Object> params);

    /**
     * 获取骑行中的设备id
     *
     * @param params
     * @return
     */
    List<Integer> getUseingIdsByAccountIds(Map<String, Object> params);

    /**
     * 查询所有设备
     *
     * @return
     */
    List<Machine> getAll();

    /**
     * 查询投放设备
     *
     * @return
     */
    List<Machine> getState(@Param("accountIds") String accountIds);

    /**
     * 根据用户码查询车辆
     *
     * @param params
     * @return
     */
    Machine getByUseCode(Map<String, Object> params);

    /**
     * 根据用户码批量查询
     *
     * @param params
     * @return
     */
    List<Machine> getByUserCodes(Map<String, Object> params);

    /**
     * 根据运营区域批量查询
     *
     * @param params
     * @return
     */
    List<Machine> getByAccountIds(Map<String, Object> params);

    /**
     * 绑定信息修改
     *
     * @param params
     */
    void boundUpdate(Map<String, Object> params);

    /**
     * 根据时间和运营区域查询
     *
     * @param params
     * @return
     */
    Integer getByAccountDate(Map<String, Object> params);

    /**
     * 更新最后借出时间
     *
     * @param params
     */
    void updateLastBorrowTime(Map<String, Object> params);

    /**
     * 获取无订单未锁车辆
     *
     * @param params
     * @return
     */
    List<Machine> getUnLock(Map<String, Object> params);

    /**
     * 查询品牌投放车辆总数
     *
     * @param accountId
     * @return
     */
    Integer getCountByBrand(Integer accountId);

    /**
     * 查询运营区域批量查询投放车辆总数
     *
     * @param map
     * @return
     */
    Integer getCountByBrandByAccountId(Map<String, Object> map);

    /**
     * 占用查询
     *
     * @param machineId
     * @return
     */
    Integer getOccupy(Integer machineId);

    /**
     * 根据运营区域查询车辆编号
     *
     * @param accountId
     * @return
     */
    List<String> getAccountIdMachine(Integer accountId);

    /**
     * 根据运营区域,获取车辆数
     *
     * @param map
     * @return
     */
    List<Map<String, Object>> getGroupByDay(Map<String, Object> map);

    /**
     * 获取运营区域正常运营数
     *
     * @return
     */
    List<Map<String, Object>> getGroupByAccountId();

    /**
     * 根据站点，查询总数
     *
     * @param map
     * @return
     */
    Integer getByParkPointIds(Map<String, Object> map);

    /**
     * 根据运营区域和车辆状态查询
     *
     * @param map
     * @return
     */
    Integer getByAccountIdType(Map<String, Object> map);

    /**
     * 根据分区和车辆状态查询
     *
     * @param map
     * @return
     */
    Integer getByRegionIdType(Map<String, Object> map);

    /**
     * 根据车辆编号，获取设备id
     *
     * @param machineNOs
     * @return
     */
    List<Integer> getMachineIdByNOs(@Param("machineNOs") String machineNOs, @Param("machineType") Integer machineType);

    /**
     * 根据车辆id，获取设备NO
     *
     * @param machineIds
     * @return
     */
    List<String> getMachineNOByIds(@Param("machineIds") String machineIds, @Param("machineType") Integer machineType);

    /**
     * 根据设备编号，获取车辆编号
     *
     * @param machineNos
     * @return
     */
    List<String> getUserCodeByMachineNo(String machineNos);

    /**
     * 根据时间查询区域车辆数
     *
     * @param lastBorrowTime
     * @return
     */
    List<Map<String, Object>> getAccountLast(String lastBorrowTime);

    /**
     * 查询时间段内的新增车辆数
     *
     * @param map
     * @return
     */
    List<Map<String, Object>> getAccountEvent(Map<String, Object> map);

    Integer ParkMachineInside(Map<String, Object> map);

    /**
     * 获取设备是否闲置
     *
     * @param map
     * @return
     */
    List<Integer> getExist(Map<String, Object> map);
    /**
     * 根据运营区域Id和状态查询设备
     * @param accountId 运营区域Id
     * @param state 状态
     * @return 设备列表
     */
    List<Machine> selectMachineListByAccountIdAndState(@Param("accountId") Integer accountId, @Param("state")Integer state);
    /**
     * 根据分区Id和状态查询设备
     * @param regionId 分区Id
     * @param state 状态
     * @return 设备列表
     */
    List<Machine> selectMachineListByRegionIdAndState(Integer regionId, Integer state);


    /**
     * 根据用户码批量查询
     *
     */
    List<Machine> getByUserCodeList(@Param("userCodeS") List<String> userCodeS);

    void changeStateBatch(@Param("userCodeS") List<String> userCodeS);

    String getByMachineIdTag(Integer machineId);

    /**
     * 批量划拨设备
     */
    void batchMoveMachine(BatchMoveMachineBO batchMoveMachineBO);

    /**
     * 根据用户码和区域批量查询
     */
    List<Machine> getByUserCodesAndAccountId(Map<String, Object> params);

    /**
     * 根据车辆编号查询数量
     * @param userCode 车辆编号
     * @return 数量
     */
    Integer countByUserCode(String userCode);

    /**
     * 根据设备编号查询数量
     * @param machineNo 设备编号
     * @return 数量
     */
    Integer countByMachineNo(String machineNo);

    /**
     * 根据车牌查询数量
     * @param license 车牌号
     * @return 数量
     */
    Integer countByLicense(String license);

    /**
     * 根据车架查询数量
     * @param frame 车架号
     * @return 数量
     */
    Integer countByFrame(String frame);

    /**
     * 根据电机号查询数量
     * @param motor 电机号
     * @return 数量
     */
    Integer countByMotor(String motor);

    /**
     * 根据设备编号获取已存在的车辆编号
     * @param mnoList 设备编号列表
     * @return 设备编号
     */
    List<String> cntMachineByMachineNO(@Param("mnoList") List<String> mnoList);

    /**
     * 根据车辆编号获取已存在的车辆编号
     * @param codeList 车辆编号列表
     * @return  车辆编号列表
     */
    List<String> cntMachineByUserCode(@Param("codeList") List<String> codeList);

    /**
     * 根据车架号获取已存在的车辆编号
     * @param frameList 车架号列表
     * @return 车架号
     */
    List<String> cntMachineByFrame(@Param("frameList") List<String> frameList);

    /**
     * 根据车牌号获取已存在的车辆编号
     * @param licenseList 车牌号列表
     * @return 车牌号
     */
    List<String> cntMachineByLicense(@Param("licenseList") List<String> licenseList);

    /**
     * 根据电机号获取已存在的车辆编号
     * @param motorList 电机号列表
     * @return 电机号
     */
    List<String> cntMachineByMotor(@Param("motorList") List<String> motorList);

    /**
     * 批量添加设备
     * @param accountId 区域id
     * @param machineType 设备类型
     * @param putIn 是否投放
     */
    void batchAddMachine(@Param("accountId") Integer accountId, @Param("machineType") Integer machineType, @Param("putIn") Integer putIn, @Param("filteredList") List<CheckMachineDTO> filteredList);

    /**
     * 根据车辆编号和设备状态类型查询车辆
     * @param userCode          车辆编号
     * @param machineStatusType 设备状态类型 0:闲置 1:骑行中 2:运维占用 3:异常
     */
    MachineVO getByUseCodeAndMachineStatus(@Param("userCode") String userCode, @Param("machineStatusType") Integer machineStatusType);

    /**
     * 更新最后一次还车时间
     *
     * @param machineNO
     * @param lastReturnTime
     */
    void updateLastReturnTime(@Param("machineNO") String machineNO, @Param("lastReturnTime") Date lastReturnTime);

    /**
     * 根据用户码和账户id查询设备
     * @param userCode  车辆编号
     * @param accountId 区域id
     * @return  Machine
     */
    Machine getByUserCodeAndAccountId(@Param("userCode")String userCode, @Param("accountId") Integer accountId);

    /**
     * 清除最后一次使用时间
     *
     * @param machineIdList 车辆id列表
     */
    void clearBatchLastUseTimeByMachineIds(@Param("machineIdList") List<Integer> machineIdList);
}